[JAVA 9] JAVA의 오버로딩(overload), 생성자(construct)

[JAVA 9] JAVA의 오버로딩(overload), 생성자(construct)

Lecture
Language
태그
language
java
public
완성
Y
생성일
Mar 17, 2024 04:53 PM
LectureName
Java

1. 오버로딩

오버로딩이란?
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있다.
 
 
오버로딩의 조건
  1. 메서드 이름이 같아야 한다.
  1. 매개변수의 개수 또는 타입이 달라야 한다.
💡
반환 타입은 상관이 없다.
 
예시
class c6_4_1 { int add(int a, int b) { return a+b; }; //case 1 매개변수의 타입이 바뀜 long add(long a, long b){ return a+b; }; //case 2 매개변수의 개수가 바뀜 int add(int a, int b, int c){ return a+b+c; }; }
 
 
오버로딩의 장점
  1. 근본적으로 같은 기능을 하는 메서드를 따로 선언할 필요가 없다.
  1. 기억하기 쉽다
  1. 이름을 짧게 할 수 있다.
 
장점 예시(println)
void println(); void println(int a); void println(float a); . . . void println(boolean a);
  • 메서드의 이름을 여러가지로 정의하지 않고 오버로딩을 통해 매개변수만 바꾸어 주었다.
 
 
가변인자와 오버로딩
  1. 가변인자란?
  • 변수를 동적으로 더 받을 수 있음 {type}… 변수명 형태로 지정
  • 매개변수 부여 수식의 끝에 와야함.
int add(int a, int b, int... number){}
 
  1. 가변인자와 매개변수의 타입을 배열로 하는 것의 차이
//매개변수의 타입이 배열 String concat(String[] str){...} //가변인자 String concat(String ...str){...}
  • 차이점
인자
가변 인자 사용
매개변수 배열
null
가능
가능
인자 x
가능
불가능
 
  1. 가변인자를 오버로딩 할때 주의사항
class c6_4_2 { public static void main(String[] args) { //main } //첫번째 가변인자 메소드 static String concat(String delim, String... args){ String result = ""; for(String str: args){ result += str + delim; } return result; } //두번째 가변인자 메소드 /* static String concat(String... args){ return concat("", args); } */ }
  • 가변 인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생한다.
  • 가변 인자를 사용한 메서드는 오버로딩 하지 않는 것이 좋다.
 
 
 

2. 생성자


2.1 생성자란

생성자는 인스턴스가 생성될때 호출되는 인스턴스 초기화 메서드이다. 인스턴스 변수의 초기화에 주로 사용되며 인스턴스 생성시에 바로 실행되어야 할 작업을 위해서도 사용된다.
  • 생성자를 설정해 주지 않으면 컴파일러가 아무런 내용도 없는 생성자를 추가해 준다.
  • 따라서 생성자를 사용할 일이 없으면 기본 생성자를 사용하는 것도 좋다.
 
 
기본 생성자, 매개변수가 있는 생성자
class Student{ String stu_name; int pki; Student(){...} //기본 생성자 } //매개변수가 있는 생성자 class Student2{ String stu_name; int pki; Student2(String name, int pki, ...){ stu_name = name; ... } } class start{ public static void main(String[] args){ //생성자를 사용하지 않을 경우 Student = st1; st1 = new Student(); st1.stuname = "jae hwan"; st1.pki = 1; ... Student2 st2; st2 = new Student2("jae hwan", 12018, ....); //매개변수가 있는 생성자 초기화 } }
  • 생성자는 클래스 안에서 클래스이름(인자){초기 선언문} 형식으로 만든다.
  • 클래스에는 기본적으로 기본 생성자가 내장되어 있다.
  • 클래스에 매개변수가 있는 생성자가 존재한다면 컴파일러는 기본 생성자를 생성하지 않는다.
 
 
생성자에서 다른 생성자 호출하기
생성자에서 다른 생성자를 호출해줄 필요가 있을 때가 있다. this()를 사용하면 생성자에서 다른 생성자를 호출해줄 수 있다.
class student { String name; String phoneNum; int door; //this.변수는 현재 생성자에서 사용할 변수이다. c6_5_4(String name, String phoneNum, int door){ this.name = color; this.gearType = gearType; this.door = door; //전달 인자가 아무것도 없을 때 생성자 } c6_5_4(){ this("white","auto",4); } //전달 인자가 color 하나일 때 생성자 c6_5_4(String color){ //this를 이용하여 생성자를 호출, 매개변수를 넣어준다. this(color, "auto", 4); } }
  • 생성자 안에 생성자를 호출 할 경우 반드시 첫 줄에서만 호출이 가능하다.
  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
 
 
생성자를 이용한 인스턴스의 복사
Car(Car c){ color = c.color; gearType = c.gearType; door = c.door; }
  • 해당 클래스의 참조변수를 넘겨준다면 생성자를 이용하여 맴버 변수를 복사할 수 있다.
 
 
 

3. 변수의 초기화


변수의 초기화
  • 멤버 변수와 배열의 초기화는 선택적이다. 멤버변수는 변수를 초기화 하지 않아도 기본값으로 초기화가 자동으로 된다.
  • 지역변수의 초기화는 필수이다.
 
➡️ 알고 가자(변수 초기화 기본값)
자료형
기본값
boolean
false
char
‘\u0000’
byte, short, int
0
long
0L
float
0.0f
double
0.0d or 0.0
참조형 변수
null
 
 
멤버 변수의 초기화 방법
  1. 명시적 초기화
→ 그냥 생성과 동시에 값을 고정시켜 넣어서 초기화.
  1. 생성자
→ 생성자 사용과 동시에 초기화
  1. 초기화 블럭
 
 
초기화 블럭
➡️ 클래스 초기화 블럭
  • 클래스 변수의 복잡한 초기화에 사용된다
  • 클래스가 메모리 영역에 올라갈 때 한번만 수행된다.
  • 초기화 순서( 기본 값 → 명시적 초기화 → 클래스 초기화 블럭)
class block{ static{ 여기서 클래스를 초기화 } }
 
➡️ 인스턴스 초기화 블럭
  • 인스턴스 변수의 복잡한 초기화에 사용된다
  • 인스턴스가 생성될 때마다 초기화된다.
  • 초기화 순서(기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자)
class block{ { 여기서 인스턴스를 초기화 } }
 
💡
인스턴스 변수의 초기화는 보통 생성자를 이용한다. 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되어야 하는 코드를 넣는데 사용한다.
 
😜 예제를 통해 왜 초기화 블럭을 사용해야 하는지 알아보자
예제 1번. 반복된 코드
class Product { static int count; int serialNum; { ++count; serialNum = count; } } class Product_Test{ public static void main(String[] args) { /* Product[] p = new Product[3]; for(int i = 0; i < p.length; i++){ System.out.print(p[i].serialNum); } */ Product p1 = new Product(); Product p2 = new Product(); Product p3 = new Product(); System.out.println(p1.serialNum); System.out.println(p2.serialNum); System.out.println(p3.serialNum); } } /* 결과 1 2 3 */
  • 인스턴스가 생성될떄마다 인스턴스 초기화 블럭이 클래스 변수를 한개 증가시키고 인스턴스 변수를 선언한다. (따로 인스턴스 변수를 계속 초기화 할 필요가 없다.
  • 클래스 변수는 초기화 되지 않기 떄문에 차량의 시리얼 번호가 계속 증가할 수있다.
 
예제 2번 - 생성자에서 반복되는 코드
class Product { static int count; Product(){ count++; } Product(int a){ count++; System.out.println(a); } } //해당 코드는 count가 중복된다 class Product { static int count; {} Product(int a){System.out.println(a);} { count++; } }